package com.nuyoah.controller;


import cn.dev33.satoken.stp.StpUtil;
import com.nuyoah.common.lang.Result;
import com.nuyoah.entity.ScoreRecord;
import com.nuyoah.entity.User;
import com.nuyoah.service.ScoreRecordService;
import com.nuyoah.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * 处理成绩查询、添加、修改、删除的请求。
 *
 * @author xyx
 * @since 2024-06-03
 */
@RestController
@RequestMapping("/score")
public class ScoreRecordController {

    @Autowired
    private ScoreRecordService scoreRecordService;

    @Autowired
    private UserService userService;
    /**
     * 查询当前用户的成绩信息。
     * <p>
     * 通过用户信息工具获取当前用户信息，进而获取用户ID。
     * 根据用户ID查询相应的成绩记录并返回。
     *
     * @return 包含用户成绩信息的结果对象。
     */
    //查询学生的成绩信息
    @RequestMapping("/query")
    public Result query(@RequestParam("id")Integer ids) {
        //通过id到用户表中查询用户信息
        User user = userService.getUserById(ids);
        // 如果用户不存在，则返回错误信息
        if (user == null) {
            return Result.fail("用户不存在");
        }
        Integer userId = user.getId();

        //根据userId到score_record表中查询学生的成绩信息,score_record表中有一个字段student_id是与user_id关联一致的
        List<ScoreRecord> scoreRecord = scoreRecordService.queryByUserId(userId);

        return Result.succ(scoreRecord);
    }


    /**
     * 添加新的成绩记录。
     * <p>
     * 接收包含成绩信息的请求体，将其添加到成绩数据库中。
     *
     * @param scoreRecord 包含待添加成绩信息的实体对象。
     * @return 表示添加操作结果的结果对象。
     */
    //添加学生的成绩信息
    @RequestMapping("/add")
    public Result add(@RequestBody ScoreRecord scoreRecord) {
        //先根据scoreRecord中的student_id到score_record表中查询是否有记录，如果有，则更新，如果没有，则新增
        scoreRecordService.addInfo(scoreRecord);
        return Result.succ("添加成功");
    }

    /**
     * 修改已有的成绩记录。
     * <p>
     * 接收包含修改后成绩信息的请求体，根据其中的信息更新数据库中的相应成绩记录。
     *
     * @param scoreRecord 包含待修改成绩信息的实体对象。
     * @return 表示修改操作结果的结果对象。
     */
    //修改学生的成绩信息
    @RequestMapping("/update")
    public Result update(@RequestBody ScoreRecord scoreRecord) {
        //先根据scoreRecord中的id到score_record表中查询是否有记录，如果有，则更新，如果没有,无法修改
        scoreRecordService.updateInfo(scoreRecord);
        return Result.succ("修改成功");
    }


    /**
     * 删除指定的成绩记录。
     * <p>
     * 根据请求中的ID参数，删除数据库中对应的成就记录。
     *
     * @param id 待删除成绩记录的ID。
     * @return 表示删除操作结果的结果对象。
     */
    //删除学生的成绩信息
    @RequestMapping("/delete")
    public Result delete(Integer id) {
        //先根据id到score_record表中查询是否有记录，如果有，则删除，如果没有,无法删除
        scoreRecordService.deleteInfo(id);
        return Result.succ("删除成功");
    }

    /**
     * 通过GET请求获取所有成绩记录。
     *
     * 此方法对应于请求映射路径"/getAll"，旨在提供一个接口，用于一次性获取数据库中的所有成绩记录。
     * 使用此接口无需提供任何请求参数，只需发送一个GET请求到指定URL。
     * 返回的结果封装在一个Result对象中，其中包含了操作是否成功的标识以及实际返回的数据。
     *
     * @return Result对象，包含所有成绩记录。如果操作成功，Result对象的success字段为true，data字段包含所有成绩记录；
     *         如果操作失败，Result对象的success字段为false，msg字段包含错误信息。
     */
    //获取所有成绩列表
    @RequestMapping("/getAll")
    public Result getAll() {
        // 调用scoreRecordService的getAll方法获取所有成绩记录，并将结果封装在Result对象中返回
        return Result.succ(scoreRecordService.getAll());
    }

}
